package com.jidolstar.astro.datetimes
{
	import com.jidolstar.astro.vo.HMS;
	
	/**
	 * 시간값을 저장하는 역할을 한다. 
	 * 지역에 의존하지 않는 보편적으로 통용되는 시간이다. 
	 * @author Yongho, Ji
	 * @since 2009.03.27
	 */ 
	public class AstroTime
	{
		private var hms:HMS;
		
		/**
		 * 시간 생성자
		 * @param hours 정수+소수값을 포함하는 시간. 보편적으로 [0, 24)의 값을 쓰지만 어떤값이 들어와도 상관없다. 
		 */ 
		public function AstroTime( hours:Number = 0 )
		{
			hms = new HMS();
			hms.hours = hours;
		}

		/**
		 * 세분화된 시간정보를 가지고 시간을 설정한다. 
		 * @param hour 시(hour)값. 보편적으로 [0,23]내의 값을 설정하지만 넘어서도 상관없다.
		 * @param minuts 분(minute)값. 보편적으로 [0,59]내의 값을 설정하지만 넘어서도 상관없다.
		 * @param seconds 초(seconds)값. 보편적으로 [0,60)내의 값을 사용하지만 넘어서도 상관없다.  
		 */ 
		public function setTime( hour:int, minute:int=0, seconds:Number = 0 ):void
		{
			hms.setHMS( hour, minute, seconds );
		}
		
		/**
		 * 정수+소수값을 포함하는 시간. 보편적으로 [0, 24)의 값을 쓰지만 어떤값이 들어와도 상관없다. 
		 */ 
		public function get hours():Number
		{
			return hms.hours;
		}
		
		/**
		 * @private
		 */ 
		public function set hours( value:Number ):void
		{
			hms.hours = value;
		}
		
		/**
		 * 시(hour)의 정수값 반환
		 */ 		
		public function get hour():int
		{
			return hms.hour;
		}

		/**
		 * 분(minute)의 정수값 반환 
		 */ 		
		public function get minute():int
		{
			return hms.minute;
		}
		
		/**
		 * 초(seconds)의 실수값 반환 
		 */ 
		public function get seconds():Number
		{
			return hms.seconds;
		}
		
		/**
		 * String으로 값 출력 
		 */ 
		public function toString( hourMark:String = "h ", minuteMark:String="m ", secondMark:String="s" ):String
		{
			var hour:int = hms.hour;
			var minute:int = hms.minute;
			var seconds:String = (hms.seconds<10) ? "0"+hms.seconds.toFixed(2) : hms.seconds.toFixed(2);
			return 	((hour<10)?"0"+hour:hour) + 
					hourMark + 
					((minute<10)?"0"+minute:minute) + 
					minuteMark + 
					seconds +
					secondMark;
		}
		
		/**
		 * 클론 생성 
		 * @return 같은 시간을 가지는 AstroTime의 객체 반환 
		 */ 
		public function clone():AstroTime
		{
			return new AstroTime( hms.hours );
		}
		
		/**
		 * 같은지 검사 
		 * @param time AstroTime의 인스턴스 
		 * @return 같으면 true
		 */ 
		public function equal( time:AstroTime ):Boolean
		{
			if( time == null ) return false;
			if( time.hours == hms.hours ) return true;
			return false;
		}

		/**
		 * hour, minute, seconds 값으로 AstroTime을 생성 
		 * @hour 시
		 * @minute 분
		 * @seconds 초 
		 * @return AstroTime의 인스턴스 
		 */ 
		public static function HMS2Time( hour:int, minute:int, seconds:Number ):AstroTime
		{
			return new AstroTime( hour + minute/60.0 + seconds/3600.0 );
		} 

	}
}